package com.szjz.elasticsearch.eshelper.base;



import com.szjz.elasticsearch.eshelper.base.wrapper.service.BatchService;
import com.szjz.elasticsearch.eshelper.base.wrapper.service.DayWrapperService;
import com.szjz.elasticsearch.eshelper.base.wrapper.service.WrapperService;
import com.szjz.elasticsearch.eshelper.page.Page;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @author shibo
 * @desc 基础服务service 业务service 需要继承于该service 才能使用其中的方法
 * @date 2020/6/3 周三
 */
public interface BaseESService<T> extends WrapperService<T>, BatchService<T>, DayWrapperService<T> {
	/**
	 * 插入数据
	 *
	 * @param t
	 */
	Boolean save(T t);

	/**
	 * 插入数据
	 *
	 * @param t
	 * @see DayWrapperService#saveOrUpdateBatchAcDay(Object)
	 */
	@Deprecated
	Boolean saveByDate(T t);

	/**
	 * 保存更新
	 */
	Boolean saveOrUpdate(T t);

	/**
	 * 按照时间分片 保存or更新
	 *
	 * @see DayWrapperService#saveOrUpdateBatchAcDay(Object)
	 */
	@Deprecated
	Boolean saveOrUpdateByDate(T t);

	/**
	 * 批量插入数据按时间分库
	 *
	 * @param tList
	 * @see DayWrapperService#saveOrUpdateBatchAcDay(List)
	 */
	@Deprecated
	Boolean saveBatchByDate(List<T> tList);

	/**
	 * 删除数据 (建议使用docId 对数据进行操作)
	 *
	 * @param id 业务id
	 * @return
	 */
	Boolean deleteById(String id);

	/**
	 * 删除数据 (建议使用docId 对数据进行操作)
	 *
	 * @param id   业务id
	 * @param date
	 * @return
	 */
	Boolean deleteByIdAndDate(String id, Date date);

	/**
	 * 删除数据
	 * 物理删除
	 *
	 * @param docId
	 * @return
	 */
	Boolean deleteByDocId(String docId);

	/**
	 * 更新文档数据
	 *
	 * @param t
	 */
	Boolean update(T t);

	/**
	 * 更新文档数据
	 *
	 * @param t
	 * @see DayWrapperService#saveOrUpdateBatchAcDay(Object)
	 */
	@Deprecated
	Boolean updateByDate(T t);

	/**
	 * 查询 (建议使用docId 对数据进行操作)
	 *
	 * @param id
	 * @return
	 */
	List<T> selectById(Object id);

	/**
	 * 查询 (建议使用docId 对数据进行操作)
	 *
	 * @param id   数据id
	 * @param date 查询对应时间的索引库
	 * @return
	 */
	List<T> selectByIdAndDate(Object id, Date date);

	/**
	 * 批量查询 (建议使用docId 对数据进行操作)
	 *
	 * @param ids 业务id
	 * @return
	 */
	List<T> selectByIds(List<String> ids);

	/**
	 * 查询
	 *
	 * @param docId es 的 _id
	 * @return
	 */
	T selectByDocId(String docId);

	/**
	 * 批量查询
	 *
	 * @param docIds es 的 _id 集合
	 * @return
	 */
	List<T> selectByDocIds(List<String> docIds);

	/**
	 * count
	 *
	 * @param t 将要查询的条件封装到t的属性中
	 * @return
	 */
	Long count(T t);

	/**
	 * count
	 *
	 * @param map 将要查询的条件封装map中
	 * @return
	 */
	Long count(Map<String, Object> map);


	/**
	 * 分页查询
	 * 匹配全部
	 *
	 * @param current
	 * @param size
	 * @return
	 */
	Page<T> page(Integer current, Integer size);


	/**
	 * 根据id判断数据是否存在
	 *
	 * @param docId es 的 _id
	 * @return
	 */
	boolean dataIsExist(String docId);

}

